package com.java.comprehensive.design.structural_model.proxy_pattern.jdk_proxy_pattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 获取代理类工厂对象
 */
 class ProxyFactory {
    //目标对象
    private final TrainStation trainStation = new TrainStation();

    public SellTicket getProxyObject() {
        /**
         * ClassLoader loader, 类加载器，用于加载代理类。可以通过目标对象获取
         *  Class<?>[] interfaces, 代理类实现的接口字节码对象
         *  InvocationHandler h 代理对象处理程序
         */
        SellTicket sellTicket = (SellTicket) Proxy.newProxyInstance(trainStation.getClass().getClassLoader(), trainStation.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *
             * @param proxy  代理对象
             *
             * @param method 接口方法进行封装的对象
             *
             *
             * @param args 实际参数
             *
             * @return 实际方法的返回值 没有为null
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("--------------------invoke执行了--------------------");
                System.out.println("代售点收取服务费（JDK动态代理）");
                //执行目标对象的方法
                Object obj = method.invoke(trainStation, args);
                return obj;
            }
        });
        return sellTicket;
    }

}
